Add a quartoFlavor field ('revealjs' | 'pdf') to the Project model.
After each successful Quarto compile, CompileController detects the output
type (output.html → revealjs, otherwise pdf) and persists it.
ProjectListController includes it in the projection and serialization so
it reaches the frontend without an extra round-trip.
Badge variants:
- quartoFlavor unset (new/uncompiled) → "Quarto PDF" #447099
- quartoFlavor 'pdf' → "Quarto PDF" #447099 (Quarto blue)
- quartoFlavor 'revealjs' → "Quarto Slides" #7e56c2 (purple)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add a Typst language (stream highlighting + completions) for .typ, and
Quarto completions (code chunks, callouts, cross-refs) for .qmd/markdown.
- Project dashboard: new Format column (Quarto/Typst/LaTeX) from the cheap
project compiler field, surfaced through the projects list API.
- Compiler dropdown: grey out engines that don't match the root file's
extension (.qmd->Quarto, .typ->Typst, .tex->LaTeX engines).
- Replace the Overleaf fill loader with an animated Verso logo: the four
quadrant circles drift on their own orbits while colour warms up with load
progress; reused on the token-access screen too.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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>
- compiler-setting.tsx: replace hardcoded LaTeX compiler list with a
single Quarto option; drop now-unused getMeta/lodash imports
- project-settings.ts: add 'quarto' to ProjectCompiler union type
- ClsiManager: detect main.qmd as a default root document (preferred
over main.tex); replace hasMainFile boolean with detectedMainFile
so we know which filename to use
- settings.defaults.js: add 'qmd' to validRootDocExtensions so .qmd
files appear as selectable root documents in the UI
- ProjectRootDocManager: sort main.qmd before main.tex in the root
doc candidate list
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* [web] Reject tracked changes notifications
feat: adding new tests
feat: adding rejected changes notifications
feat: adding tests for rejectchanges
feat: updating tests for rejecting notifications;
feat: adding in rejecting user, and improving subject and activity line
fix: moving to a params object instead of positionals for email building
feat: updating to use events triggered from applyUpdate in document-updater
feat: updating to send rejected author ids with rejected change notification instead of change ids
feat: moving rejected author notification determination to updateManager instead of RangesManager, which is used by other paths
feat: only map to author if changes were made
* fix: gate by user status not project status
* fix: unit tests post-rebase
---------
Co-authored-by: Kristina Hjertberg <kristina.hjertberg@overleaf.com>
GitOrigin-RevId: f992e1885c47d1a6cf776740769d6d4763f3cb7c
[web] Check `domainCapturedByGroup` on domain instead of `group.domainCaptureEnabled` only for project/dash redirect
GitOrigin-RevId: a6389da9c943327e5941eaa24eb274106526f80b
* feat: update doc manager to return a list of contributors to the accepted change
* feat: add new notification type for accepting a tracked change
* update email with tracked changes accepted
* feat: update tests
* fix: feedback on consistent api and returns
* feat: adding new tests
* feat: self accepted changes shouldnt trigger notification, and using existing changesAccepted hook
* Add better subject and activity list for track change accepted (#33094)
* feat: add better activity list entry and subject header for accepted changes, to match other notifications
* feat: updating tests
* feat: updating accepting_user_id to just user_id
* fix: adding users in emailBuilder test to userCache
GitOrigin-RevId: 6114f77916b5f503b7bbbb5ca8fed99e58edc31b
* Migrating reference settings to mongo and exposing them through code mirror context
* removing undefined optional for reference manager type settings
* allowing partial updates to user settings objects, and remove repeated cypress intercepts
* Zod schema parsing for user reference manager settings
* Splitting ref provider mongoose schema into const
* Persisting local storage reference settings to mongo and deleting from local
* Enforcing ref provider group id to always be type string
* Fixing test and format errors
* Migrated flag for settings to only migrate once
* fixing cypress tests adding migrated flag
* persisting local storage to allow for easy rollback
GitOrigin-RevId: f59522bdee6f0e56efb7d98b9d9373a743619ec8
* update webhook handler to include cancel_at
* guard against accidentally marking subscription event as canceled
* fix cancellation edgecase (reactivating a subscription that was canceled from Stripe Dashboard and also has a non-migration schedule)
GitOrigin-RevId: a872e91afa19094d4ae859293fc9669ea3e528f2
* feat: adding usage rate limiting to workbench and aligning editor context values for suggestionsLeft
* feat: prepend word token to headers of token rate limiter to prevent confusion with usage rate limiter
* Shared AI paywalls (#31948)
* feat: renaming hasPremiumSuggestion and adding token limits to editor context and project load
* feat: adding new ai features paywall component
* feat: rename getRemainingFeatureUses to token based naming for token based limiter, removed checking for feature usage on anonymous users, and removed guard on null userId since we shouldnt be calling getRemainingFeatureUses on a nonexistent user
* feat: using token rate limit headers to set token rate values in editor context
* feat: update workbench to be available without refreshing if rate limit reset occurs within session
* fix: move paywall out of inert section
* Hide new paywalls behind FF and open plans page on upgrade attempt (#32023)
* feat: hide new paywalls behind FF
* feat: update ai paywall buttons to navigate to plans page post quota plans change release
* feat: showing a fair limit notificaiton pre-quota change, and updating paywall to not fire if user has premium already (#32056)
GitOrigin-RevId: 565fb128d55543fea34c383bc4abeaa3dd148d09
* Add tooltip next to "Overleaf AI" row
* Add AI to features list
* Fix tests
* Revert changes which will be overwritten by https://github.com/overleaf/internal/pull/31993
* Add missing import (conflict with main)
GitOrigin-RevId: ce236670bd63701a3976a3eb84dc695ee0e928b1
* 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: 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: remove wf.enabled in favor for aiFeatures.enabled for display, and writefull.promotionSet for determining if we should autoload or autocreate
GitOrigin-RevId: 2b7a5b8a430a804f6c9804cc926cb5c057e34df5
* make warnings more eye catching in clean up dry run
* only increment processedCount after processing
* always rm recurlyAccountCode
* check if existing Stripe customer already has a subscription
* ensure no other customer accounts share the user id
* set recurly_to_stripe_migration_status to cancelled in cancel script
* add script for updating metadata of canceled migrations
GitOrigin-RevId: 3331de480e99774679ff2649b90d41e981a8fdef
* return early from various event handlers if the subscription isn't controlled by the payment provider sending the event
* update `Subscription` type for webhook events
GitOrigin-RevId: f3fc345c37bbe134b7696ccde9d6d8c7608f8f12
* [notifications] Refactor notification handling by using getProject utility function
* [notifications] Add support for reopened comment notifications
* rename to areNotificationsEnabled
* added comment explaining why we are getting users
GitOrigin-RevId: 7263d52e611c66baa39d8737d1d22740e592a3a0